class Solution {
public:
    int maxArea(vector<int>& h) {

        // 两个指针，一个指向起始位置，一个末尾位置
        // 移动哪个指针呢？
        // 面积 = min(height[left], height[right]) * (right - left)
        // 如果移动大的那一方，首先后部分(right - left)肯定减小
        // 分析前半部分：
        // 假设大的一方移完变长，那min(height[left], height[right])不变，面积减小
        // 假设大的一方移完变短，且长于height[left]，那min(height[left], height[right])还是不变，面积减小
        // 假设大的一方移完变短，且短于height[left]，那min(height[left], height[right])减小，面积减小
        // 根据上述情况，面积只会变小

        // 如果移动小的那一方，首先后部分(right - left)肯定减小
        // 假设移完变小，那面积自然减小
        // 假设移完变大，且大于height[right]，那min(height[left], height[right])有可能变大
        // 假设移完变大，且短于height[right]，那min(height[left], height[right])也有可能变大
        // 所以应该移动小的一方

        // 如果两个指针指向的内容相等，那移动哪一方都可以，因为都有可能变大，或者变小

        int l = 0;
        int r = h.size() - 1;
        int ans = 0;
        while(l <= r)
        {
            ans = max(ans, min(h[l], h[r]) * (r - l));
            if(h[r] <= h[l]) r--;
            else if(h[l] < h[r]) l++;
        }
        return ans;
    }
};